home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / c / stut_src / list_db.c < prev    next >
Text File  |  1996-05-27  |  16KB  |  655 lines

  1. /*
  2.  * list_db.c
  3.  *
  4.  * Purpose:
  5.  * -------- 
  6.  * liste des messages d'une rubrique:
  7.  *
  8.  * History:
  9.  * --------
  10.  * 24.01.95: fplanque: Created
  11.  */
  12.  
  13.  
  14.      #include "!OPTIONS.H"                /* Options de compilation */         
  15.     #define    THIS_FILE    "LIST_DB.C v1.00 - 02.95"
  16.           
  17.  
  18. /*
  19.  * System headers:
  20.  */
  21.     #include    <stdio.h>                    /* header standard */
  22.     #include <string.h>                    /* header tt de chaines */
  23.  
  24. /*
  25.  * Custom headers:
  26.  */
  27.     #include "SPEC_PU.H"
  28.     #include "S_MALLOC.H"
  29.     #include "DEF_ARBO.H"
  30.     #include "DATPG_PU.H"
  31.     #include "DBSYS_PU.H"
  32.     #include    "DEBUG_PU.H"    
  33.     #include    "SERV_PU.H"
  34.     #include    "LINE0_PU.H"
  35.     #include    "DBINT_PU.H"
  36.     #include    "IOFLD_PU.H"
  37.     #include "LISTD_PU.H"
  38.     #include "GENRC_PU.H"
  39.     #include "TERM_PU.H"
  40.     #include "TEXT_PU.H"
  41.     #include "SERCOMPU.H"
  42.  
  43.  
  44. /*            
  45.  * --------------------------- METHODES -------------------------------
  46.  */
  47.  
  48.  
  49. /*
  50.  * ListDB_ENPG(-)
  51.  *
  52.  * Purpose:
  53.  * --------
  54.  * Traitrement des initialisations ENTER PAGE
  55.  *
  56.  * History:
  57.  * --------
  58.  * 24.01.95: fplanque: Created
  59.  */
  60. void    ListDB_ENPG(
  61.             VOIE    *    pVoie_curr,        /* In: Voie concern‚e */
  62.             int        n_DBFnct )        /* In: Fonction Db … utiliser */
  63. {
  64.     /*
  65.      * Ouvre base de donn‚es:
  66.      */
  67.     register_action( pVoie_curr, OPDB, n_DBFnct, 0, NULL );
  68.     /*
  69.      * Affiche donn‚es 
  70.      */
  71.     register_action( pVoie_curr, DDAT, 0, 0, NULL );
  72.     register_action( pVoie_curr, DPAG, 0, 0, NULL );
  73. }
  74.  
  75.  
  76.  
  77. /*
  78.  * ListDB_OPDB(-)
  79.  *
  80.  * Purpose:
  81.  * --------
  82.  * On vient d'ouvrir une base de donn‚es
  83.  * -> traitement sp‚cial?
  84.  *
  85.  * History:
  86.  * --------
  87.  * 25.01.95: fplanque: Created base on LectMsg_OPDB
  88.  * 30.01.95: demande readlocks sur tout ce qui va ˆtre affich‚ et saue ptrs dans un tableau cr‚‚ dynamiquement
  89.  */
  90. void    ListDB_OPDB(
  91.             VOIE    *    pVoie_curr )        /* In: Voie concern‚e */
  92. {
  93.     ARBO_LISTPARS    * pArboListPars = pVoie_curr -> arboparams -> pArboListPars;
  94.  
  95.     /* 
  96.      * On vient d'ouvrir la DB:
  97.      * On va fixer un ptr sur le message en cours de lecture: 
  98.      */
  99.     DATAPAGE            *    dbase = pVoie_curr -> database;        /* Base de donn‚es concern‚e */
  100.     DATA_RECORDS    *    data_recs = dbase -> data.records;    /* Infos sur les enregistrements */
  101.  
  102.     /*
  103.       * Sauve Ptr sur 1er record:
  104.      */    
  105.     COMPACT_RECORD * pCompRec = data_recs -> first_record;    
  106.  
  107.     /*
  108.      * Calcule le nombre de records qui vont ˆtre affich‚s:
  109.      */
  110.     int    nb_DisplayedRecs;
  111.     int    nb_MaxDisplayedRecs = pArboListPars -> nb_Cols * pArboListPars -> nb_Lines;
  112.     COMPACT_RECORD * * pTCompRec_ptrs;
  113.  
  114.     /*
  115.      * Alloue une zone pour les pointeurs vers les messages:
  116.      */
  117.     pTCompRec_ptrs = MALLOC( sizeof(COMPACT_RECORD*) * nb_MaxDisplayedRecs );
  118.     pVoie_curr -> pTCompRec_ptrs = pTCompRec_ptrs;
  119.     pVoie_curr -> nb_MaxDisplayedRecs = nb_MaxDisplayedRecs;
  120.  
  121.     /*
  122.      * Parcourt les messages :
  123.      * et prends un Readlock sur tout ce qu'on rencontre
  124.      * pour l'afficher sur la page courante:
  125.      */
  126.     for( nb_DisplayedRecs = 0 ;
  127.             pCompRec != NULL && nb_DisplayedRecs < nb_MaxDisplayedRecs ; 
  128.              pCompRec = pCompRec -> next )
  129.     {    
  130.         /*
  131.          * Demande un lock de lecture sur le record:
  132.          * et sauve ptr dans le tableau des pts d'accŠs. NULL si pas obtenu
  133.          * Un record de plus d'affich‚:
  134.          */
  135.         pTCompRec_ptrs[ nb_DisplayedRecs ++ ] = DBInt_requestReadLock( pVoie_curr, pCompRec );
  136.     }
  137.  
  138.     /*
  139.      * On met ‡a … NULL parce que les ptrs se trouvent dans le tableau!
  140.      *
  141.     pVoie_curr -> curr_comprec = NULL;
  142.  
  143.     /*
  144.      * Nombre de records effectivement affich‚s:
  145.      */
  146.     pVoie_curr -> nb_DisplayedRecs = nb_DisplayedRecs;
  147.  
  148.     /*
  149.      * Num‚ro de record en haut de l'‚cran:
  150.      * Num‚ro de record courant:
  151.      */
  152.     pVoie_curr -> n_RecIndex_Top = 1;
  153.     pVoie_curr -> n_RecIndex_Curr = 1;
  154.  
  155. }
  156.  
  157.  
  158. /*
  159.  * ListDB_DispData(-)
  160.  *
  161.  * Purpose:
  162.  * --------
  163.  * Affiche les donn‚es initiales … l'‚cran:
  164.  *
  165.  * Notes:
  166.  * ------
  167.  * Ceci n'est normalement ‚x‚cut‚ qu'une seule fois … l'entr‚e de la page
  168.  *
  169.  * History:
  170.  * --------
  171.  * 24.01.95: fplanque: Created
  172.  */
  173. void    ListDB_DispData(
  174.             VOIE *    pVoie_curr )    /* In: Voie concern‚e */
  175. {
  176.     /*
  177.      * Affichage champs groupe 1 (commentaire...):
  178.      */
  179.     OutFields_DisplayGroup( pVoie_curr, 1, 0, 0 );
  180.  
  181.     /*
  182.      * Nu‚mro de page courant:
  183.      * (A d‚placer qd ce sera dispo vers 'DispMSG' cad Groupe 2!)
  184.      */
  185.     pVoie_curr -> n_PageNumber_Curr = 1;
  186. }
  187.  
  188.  
  189.  
  190. /*
  191.  * ListDB_DispPage(-)
  192.  *
  193.  * Purpose:
  194.  * --------
  195.  * Affiche une page de liste
  196.  *
  197.  * Notes:
  198.  * ------
  199.  * Readlocks?
  200.  *
  201.  * History:
  202.  * --------
  203.  * 25.01.95: fplanque: Created
  204.  * 30.01.95: prend les comprecs dans le tableau
  205.  */
  206. void    ListDB_DispPage(
  207.             VOIE *    pVoie_curr )    /* In: Voie concern‚e */
  208. {
  209.     ARBO_LISTPARS    * pArboListPars = pVoie_curr -> arboparams -> pArboListPars;
  210.  
  211.     COMPACT_RECORD ** pTCompRec_ptrs = pVoie_curr -> pTCompRec_ptrs;
  212.     
  213.     /*
  214.      * Compteurs de boucles, colones, et lignes:
  215.      */
  216.     int    n_Column;
  217.     int    n_Line;
  218.     int    n_IndexCompRecCurr = 0;        /* Index du record en cours d'affichage */
  219.     /*
  220.      * Offsets d'affichage par rapport aux champs de r‚f‚rence
  221.      * du groupe 4:
  222.      */
  223.     int    n_XOffset = 0;
  224.     int    n_YOffset;
  225.  
  226.     for( n_Column = 1; n_Column <= pArboListPars -> nb_Cols; n_Column++ )
  227.     {
  228.         /*
  229.          * On commence une nouvelle colonne:
  230.          */
  231.         n_YOffset = 0;
  232.  
  233.         for( n_Line = 1; n_Line <= pArboListPars -> nb_Lines; n_Line++ )
  234.         {
  235.             if( n_IndexCompRecCurr >= pVoie_curr -> nb_DisplayedRecs )
  236.             {    /*
  237.                  * S'il n'y a plus rien … afficher!
  238.                  */
  239.                 return;
  240.             }
  241.  
  242.             /*
  243.              * Affichage des champs du groupe 4:
  244.              */
  245.             pVoie_curr -> curr_comprec = pTCompRec_ptrs[ n_IndexCompRecCurr ];
  246.             OutFields_DisplayGroup( pVoie_curr, 4, n_XOffset, n_YOffset );
  247.     
  248.             /*
  249.              * Prochain no de record:
  250.              */
  251.              n_IndexCompRecCurr ++;                        /* Relatif … la page */
  252.              (pVoie_curr -> n_RecIndex_Curr) ++;    /* + ou - Relatif au d‚but du groupe */
  253.             
  254.             /*
  255.              * Descend … l'‚cran:
  256.              */
  257.             n_YOffset += pArboListPars -> n_InterLine;
  258.         }
  259.     
  260.         /*
  261.          * Passe … la colonne suivante … l'‚cran:
  262.          */
  263.         n_XOffset += pArboListPars -> n_InterCol;
  264.     }
  265. }
  266.  
  267.  
  268. /*
  269.  * ListMsg_ChgePage(-)
  270.  *
  271.  * Purpose:
  272.  * --------
  273.  * Changement de page dans la liste suite … pression sur SUITE ou RETOUR
  274.  *
  275.  * History:
  276.  * --------
  277.  * 13.02.95: fplanque: Created
  278.  */
  279. void    ListMsg_ChgePage( 
  280.             VOIE    *    pVoie_curr,            /* In: Voie concern‚e */
  281.             KEYCODE    curr_keypress )    /* In: Touche press‚e */
  282. {
  283.     /*
  284.      * Tableau des readlocks courants:
  285.      */
  286.     COMPACT_RECORD * * pTCompRec_ptrs = pVoie_curr -> pTCompRec_ptrs;
  287.     COMPACT_RECORD * pCompRec;
  288.     int     i;
  289.     int    nb_DisplayedRecs = pVoie_curr -> nb_DisplayedRecs;
  290.     int    nb_MaxDisplayedRecs = pVoie_curr -> nb_MaxDisplayedRecs;
  291.  
  292.     if( nb_DisplayedRecs == 0 )
  293.     {    /*
  294.          * S'il n'y a rien d'affich‚
  295.          * ... c'est qu'il n'y a rien … afficher!
  296.          */
  297.         aff_msg_l0( pVoie_curr, "Liste vide!" );
  298.         return;
  299.     }
  300.  
  301.     affiche_touche( pVoie_curr, curr_keypress );        /* Affiche nom de la touche */
  302.  
  303.     if( curr_keypress == KEY_RETOUR )
  304.     {    /*
  305.          * Retour:
  306.          */
  307.         COMPACT_RECORD * pCompRec_CurrTop = pTCompRec_ptrs[ 0 ];
  308.         if( pCompRec_CurrTop == NULL || pCompRec_CurrTop -> prev == NULL )
  309.         {
  310.             aff_msg_l0( pVoie_curr, "D‚but de liste!" );
  311.             return;
  312.         }
  313.  
  314.         /*
  315.          * LibŠre locks actuels:
  316.          */
  317.         for( i=0; i < nb_DisplayedRecs; i++ )
  318.         {
  319.             DBInt_releaseReadLock( pVoie_curr, pTCompRec_ptrs[ i ] );                
  320.         }
  321.  
  322.         /*
  323.          * Essaye d'aller d'une page en arriŠre:
  324.          */
  325.         i=1;
  326.         pCompRec = pCompRec_CurrTop -> prev;
  327.         while( i < nb_MaxDisplayedRecs && pCompRec -> prev != NULL )
  328.         {
  329.             i++;
  330.             pCompRec = pCompRec -> prev;
  331.         }    
  332.  
  333.         /*
  334.          * Num‚ro de record en haut de l'‚cran:
  335.          * Num‚ro de record courant:
  336.          */
  337.         pVoie_curr -> n_RecIndex_Top -= i;
  338.         if( pVoie_curr -> n_RecIndex_Top < 1 )
  339.         {    /* On ne peut descendre en dessous de "1" */
  340.             pVoie_curr -> n_RecIndex_Top = 1;
  341.         }
  342.         pVoie_curr -> n_RecIndex_Curr = pVoie_curr -> n_RecIndex_Top;
  343.  
  344.         /*
  345.          * Parcourt les messages suivants:
  346.          * et prends un Readlock sur tout ce qu'on rencontre
  347.          * pour l'afficher sur la page suivante:
  348.          */
  349.         for( nb_DisplayedRecs = 0;
  350.                 pCompRec != NULL && nb_DisplayedRecs < nb_MaxDisplayedRecs; 
  351.                  pCompRec = pCompRec -> next )
  352.         {    
  353.             /*
  354.              * Demande un lock de lecture sur le record:
  355.              * et sauve ptr dans le tableau des pts d'accŠs. NULL si pas obtenu
  356.              * Un record de plus d'affich‚:
  357.              */
  358.             pTCompRec_ptrs[ nb_DisplayedRecs ++ ] = DBInt_requestReadLock( pVoie_curr, pCompRec );
  359.         }
  360.  
  361.         /*
  362.          * Nombre de records effectivement affich‚s:
  363.          */
  364.         pVoie_curr -> nb_DisplayedRecs = nb_DisplayedRecs;
  365.     
  366.         /*
  367.          * Demande r‚affichage page:
  368.          */
  369.         Generic_DisplayPageChange( pVoie_curr );
  370.  
  371.     }
  372.     else
  373.     {    /*
  374.          * Suite:
  375.          */    
  376.         COMPACT_RECORD * pCompRec_CurrBottom = pTCompRec_ptrs[ nb_DisplayedRecs -1 ];
  377.         if( pCompRec_CurrBottom == NULL || pCompRec_CurrBottom -> next == NULL )
  378.         {
  379.             aff_msg_l0( pVoie_curr, "Fin de liste!" );
  380.             return;
  381.         }
  382.     
  383.         /*
  384.          * LibŠre locks actuels:
  385.          */
  386.         for( i=0; i < nb_DisplayedRecs; i++ )
  387.         {
  388.             DBInt_releaseReadLock( pVoie_curr, pTCompRec_ptrs[ i ] );                
  389.         }
  390.     
  391.         /*
  392.          * Num‚ro de record en haut de l'‚cran:
  393.          * Num‚ro de record courant:
  394.          */
  395.         pVoie_curr -> n_RecIndex_Top += nb_DisplayedRecs;
  396.         pVoie_curr -> n_RecIndex_Curr = pVoie_curr -> n_RecIndex_Top;
  397.  
  398.         /*
  399.          * Parcourt les messages suivants:
  400.          * et prends un Readlock sur tout ce qu'on rencontre
  401.          * pour l'afficher sur la page suivante:
  402.          */
  403.         for( nb_DisplayedRecs = 0 , pCompRec = pCompRec_CurrBottom -> next ;
  404.                 pCompRec != NULL && nb_DisplayedRecs < nb_MaxDisplayedRecs; 
  405.                  pCompRec = pCompRec -> next )
  406.         {    
  407.             /*
  408.              * Demande un lock de lecture sur le record:
  409.              * et sauve ptr dans le tableau des pts d'accŠs. NULL si pas obtenu
  410.              * Un record de plus d'affich‚:
  411.              */
  412.             pTCompRec_ptrs[ nb_DisplayedRecs ++ ] = DBInt_requestReadLock( pVoie_curr, pCompRec );
  413.         }
  414.  
  415.         /*
  416.          * Nombre de records effectivement affich‚s:
  417.          */
  418.         pVoie_curr -> nb_DisplayedRecs = nb_DisplayedRecs;
  419.     
  420.         /*
  421.          * Demande r‚affichage page:
  422.          */
  423.         Generic_DisplayPageChange( pVoie_curr );
  424.     }
  425. }
  426.  
  427.  
  428. /* 
  429.  * ListDB_AccessRecbyNo(-)
  430.  *
  431.  * AccŠs … un record d'aprŠs son num‚ro
  432.  * tel qu'il est courament affich‚ … l'‚cran 
  433.  * du terminal
  434.  *
  435.  * 15.03.95: Created
  436.  */
  437. COMPACT_RECORD *    ListDB_AccessRecbyNo(    /* Out: Record demand‚ ou NULL */
  438.                             VOIE    *    pVoie_curr,    /* In:  Voie concern‚e */
  439.                             long        l_number )    /* In:  No du rec d‚sir‚ */            
  440. {
  441.     if( l_number >= pVoie_curr -> n_RecIndex_Top && l_number < pVoie_curr -> n_RecIndex_Curr )
  442.     {
  443.         int    n_RecIndex = (int) (l_number - pVoie_curr -> n_RecIndex_Top);
  444.         COMPACT_RECORD * pCompactRec_Target = pVoie_curr -> pTCompRec_ptrs[ n_RecIndex ];
  445.  
  446.         if( pCompactRec_Target == NULL )
  447.         {    /*
  448.              * Impossible d'acc‚der … ce Record:
  449.              * Cause probable: il ‚tait lock‚ lors de la constitution de la liste:
  450.              */
  451.             aff_msg_l0( pVoie_curr, "Enregistrement incaccessible!" );
  452.             sprintf( G_tmp_buffer, "     Enregistrement %ld incaccessible!", l_number );
  453.             add_textinf( pVoie_curr -> wi_params, G_tmp_buffer );
  454.             return    NULL;
  455.         }
  456.         
  457.         return    pCompactRec_Target;
  458.     }
  459.  
  460.     aff_msg_l0( pVoie_curr, "Num‚ro enregistrement incorrect!" );
  461.     add_textinf( pVoie_curr -> wi_params, "     Num‚ro de record hors limites!" );
  462.  
  463.     return    NULL;
  464. }            
  465.  
  466.  
  467. /*
  468.  * ListDB_CmdDelRec(-)
  469.  *
  470.  * Purpose:
  471.  * --------
  472.  * Commande Delete d‚terminant l'effacement
  473.  *
  474.  * History:
  475.  * --------
  476.  * 15.03.95: fplanque: Created
  477.  */
  478. BOOL    ListDB_CmdDelRec(                    /* Out: !FALSE si succŠs */
  479.             VOIE    *    pVoie_curr,            /* In:  Voie concern‚e */
  480.             char    *    piBsz_Arguments )    /* In:  Arguments pass‚s derriŠre la commande */
  481. {
  482.     long                    l_number;
  483.     COMPACT_RECORD *     pCompactRec_Target;
  484.     
  485.     /*
  486.      * Essaie d'extraire no de record … effacer:
  487.      */
  488.     if( !extract_number( piBsz_Arguments, &l_number ) )
  489.     {    /*
  490.          * Pas de num‚ro!
  491.          */
  492.         aff_msg_l0( pVoie_curr, "ParamŠtre manquant!" );
  493.         add_textinf( pVoie_curr -> wi_params, "    ParamŠtre manquant!" );
  494.         return FALSE0;
  495.     }
  496.     
  497.     /*
  498.      * Essaie d'acc‚der au record concern‚:
  499.      */
  500.     pCompactRec_Target = ListDB_AccessRecbyNo( pVoie_curr, l_number );
  501.     if( pCompactRec_Target == NULL )
  502.     {    /*
  503.          * Echec accŠs:
  504.          */
  505.         return FALSE0;
  506.     }
  507.         
  508.     sprintf( G_tmp_buffer, "    Effacement du record no: %ld", l_number );
  509.     add_textinf( pVoie_curr -> wi_params, G_tmp_buffer );
  510.     
  511.     /*
  512.      * Demande l'effacement:
  513.      */
  514.     if( CompRec_Erase( pVoie_curr, pCompactRec_Target, pVoie_curr -> database ) == FALSE0 )
  515.     {
  516.         return    FALSE0;
  517.     }     
  518.  
  519.     /*
  520.      * Efface le pointeur du tableau de liste
  521.      * vers le record n'existant plus.
  522.      */
  523.     {
  524.         int    n_RecIndex = (int) (l_number - pVoie_curr -> n_RecIndex_Top);
  525.         /*
  526.           * Test de coh‚rence:
  527.          */
  528.         if( pVoie_curr -> pTCompRec_ptrs[ n_RecIndex ] == pCompactRec_Target )
  529.         {    /*
  530.              * Oublie ce record:
  531.              */
  532.             pVoie_curr -> pTCompRec_ptrs[ n_RecIndex ] = NULL;
  533.         }
  534.         else
  535.         {
  536.             signale( "Ne trouve plus record dans table de liste!" );
  537.         }
  538.     }
  539.  
  540.     /*
  541.      * Il faut mettre … jour l'affichage!
  542.      */
  543.     
  544.  
  545.     return    TRUE_1;
  546. }
  547.  
  548.  
  549.  
  550. /*
  551.  * ListMsg_KeyAction(-)
  552.  *
  553.  * Purpose:
  554.  * --------
  555.  * R‚agit … la touche press‚e sur une page de Liste
  556.  *
  557.  * History:
  558.  * --------
  559.  * 30.01.95: fplanque: Created
  560.  * 15.03.95: affinement effacement message
  561.  */
  562. void    ListMsg_KeyAction( 
  563.             KEYCODE    curr_keypress, /* In: Touche press‚e */
  564.             VOIE    *    pVoie_curr )    /* In: Voie concern‚e */
  565. {
  566.     switch( curr_keypress )
  567.     {
  568.         case    KEY_RETOUR:
  569.         case    KEY_SUITE:
  570.             /*
  571.              * On veut changer de page:
  572.              */
  573.             ListMsg_ChgePage( pVoie_curr, curr_keypress ); 
  574.             break;
  575.                     
  576.         case    KEY_ENVOI:                
  577.         {    /*
  578.               * Obtient ligne de commande:    
  579.               * (NE PAS MODIFIER la ligne de commande!)
  580.              */
  581.             const char * cpBsz_CmdLine = aim_CurrField( pVoie_curr );
  582.             
  583.             long    l_number;
  584.             
  585.             if( extract_number( cpBsz_CmdLine, &l_number ) )
  586.             {    /*
  587.                  * Demande d'accŠs direct:
  588.                  * Essaie d'acc‚der au record concern‚:
  589.                  */
  590.                 COMPACT_RECORD * pCompactRec_Target;
  591.  
  592.                 sprintf( G_tmp_buffer, "  AccŠs direct au record no: %ld", l_number );
  593.                 add_textinf( pVoie_curr -> wi_params, G_tmp_buffer );
  594.  
  595.                 pCompactRec_Target = ListDB_AccessRecbyNo( pVoie_curr, l_number );
  596.                 if( pCompactRec_Target == NULL )
  597.                 {    /*
  598.                      * Echec accŠs:
  599.                      */
  600.                     return;
  601.                 }
  602.                 
  603.                 /*
  604.                  * Demande Changement de page:
  605.                  */
  606.                 if( follow_ArboLink( pVoie_curr, FL_WATCH ) == TRUE_1 )
  607.                 {    /*
  608.                      * M‚morise ptr sur le record et sa DB 
  609.                      * en guise parametres pour la page arbo suivante:
  610.                      */
  611.                     pVoie_curr -> pDataPage_LockedDB_OUT = pVoie_curr -> database;
  612.                     pVoie_curr -> pCompRec_Locked_OUT = pCompactRec_Target;
  613.                     /*
  614.                      * Supprime m‚mo readlock de la liste
  615.                      * pour ‚viter lib‚ration automatique au changement de page:
  616.                      */
  617.                     DBInt_RemoveLockFromList( pVoie_curr, pCompactRec_Target );
  618.                 }
  619.                 return;
  620.             }
  621.  
  622.             /*
  623.              * On n'a pas tap‚ un nombre...
  624.              */
  625.  
  626.             if( ! serv_handleKeyword( pVoie_curr, '\0' ) )
  627.             {    /*
  628.                  * Si pas de mot clef:
  629.                  */
  630.                 affiche_touche( pVoie_curr, curr_keypress );        /* Affiche nom de la touche */
  631.  
  632.                 /*
  633.                  * Demande Changement de page:
  634.                  */
  635.                 follow_KeyArboLink( pVoie_curr, curr_keypress );
  636.             }
  637.             break;
  638.         }
  639.  
  640.         case    KEY_ANNUL:
  641.         case    KEY_REPET:
  642.         case    KEY_GUIDE:
  643.         case    KEY_SOMM:
  644.         case    KEY_CORREC:
  645.             affiche_touche( pVoie_curr, curr_keypress );        /* Affiche nom de la touche */
  646.             /*
  647.              * Demande Changement de page:
  648.              */
  649.             follow_KeyArboLink( pVoie_curr, curr_keypress );
  650.             break;
  651.  
  652.     }
  653. }
  654.  
  655.